package co.edu.javeriana.konigsberg.xavier.servicio;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.ejb.EJB;
import javax.ejb.Stateful;
import javax.ejb.Stateless;

import co.edu.javeriana.konigsberg.xavier.dao.desc.DepartamentoFacultadDAOLocal;
import co.edu.javeriana.konigsberg.xavier.dto.DepartamentoFacultadDTO;
import co.edu.javeriana.konigsberg.xavier.dto.FacultadDTO;
import co.edu.javeriana.konigsberg.xavier.entidad.DepartamentoFacultad;

/**
 * Session Bean implementation class DepartamentoServicio
 */
@Stateless
public class DepartamentoFacultadServicio implements DepartamentoFacultadServicioRemote, DepartamentoFacultadServicioLocal {

	@EJB
	private DepartamentoFacultadDAOLocal departamentoFacultadDAO;
	
	private static Map<BigInteger, List<DepartamentoFacultadDTO>> mapaDepartamentoFacultadPorPais;
	private static Map<BigInteger, DepartamentoFacultadDTO> mapaDepartamentoFacultads;
    /**
     * Default constructor. 
     */
    public DepartamentoFacultadServicio() {
        // TODO Auto-generated constructor stub
    }
    
    @Override
    public List<DepartamentoFacultadDTO> obtenerLista(){
    	List<DepartamentoFacultad> departamentoFacultads = departamentoFacultadDAO.obtenerLista();
		return getDTOList(departamentoFacultads);
    }

	private List<DepartamentoFacultadDTO> getDTOList(List<DepartamentoFacultad> departamentoFacultads) {
		List<DepartamentoFacultadDTO> departamentoFacultadDTOs = new ArrayList<DepartamentoFacultadDTO>();
		for (DepartamentoFacultad departamentoFacultad : departamentoFacultads) {
			DepartamentoFacultadDTO departamentoFacultadDTO = new DepartamentoFacultadDTO();
			departamentoFacultadDTO.setIdDepartamentoFacultad(departamentoFacultad.getIdDepartamentoFacultad());
			departamentoFacultadDTO.setNombreDepartamentoFacultad(departamentoFacultad.getNombreDepartamentoFacultad());
			departamentoFacultadDTOs.add(departamentoFacultadDTO);
		}
		return departamentoFacultadDTOs;
	}
    
    @Override
    public List<DepartamentoFacultadDTO> obtenerListaDePadre(FacultadDTO facultadDTO){
    	if(mapaDepartamentoFacultadPorPais == null){
    		mapaDepartamentoFacultadPorPais = new HashMap<BigInteger, List<DepartamentoFacultadDTO>>();
		}
		if(mapaDepartamentoFacultadPorPais.containsKey(facultadDTO.getIdFacultad())){
			return mapaDepartamentoFacultadPorPais.get(facultadDTO.getIdFacultad());
		}else{
			if(mapaDepartamentoFacultads == null){
				mapaDepartamentoFacultads = new HashMap<BigInteger, DepartamentoFacultadDTO>();
			}
			List<DepartamentoFacultad> departamentoFacultads = departamentoFacultadDAO.obtenerListaPorPadre(facultadDTO.getIdFacultad());
			List<DepartamentoFacultadDTO> departamentoFacultadDTOs = new ArrayList<DepartamentoFacultadDTO>();
			for (DepartamentoFacultad departamentoFacultad : departamentoFacultads) {
				DepartamentoFacultadDTO departamentoFacultadDTO = getDTO(departamentoFacultad, facultadDTO);
				departamentoFacultadDTOs.add(departamentoFacultadDTO);
				mapaDepartamentoFacultads.put(departamentoFacultadDTO.getIdDepartamentoFacultad(), departamentoFacultadDTO);
			}
			mapaDepartamentoFacultadPorPais.put(facultadDTO.getIdFacultad(), departamentoFacultadDTOs);
			return departamentoFacultadDTOs;
		}
		
	}

	@Override
	public DepartamentoFacultadDTO obtenerDepartamentoFacultadPorId(BigInteger id) {
		return mapaDepartamentoFacultads.get(id);
	}

	@Override
	public DepartamentoFacultadDTO getDTO(Object entidad, FacultadDTO facultadDTO) {
		DepartamentoFacultad departamentoFacultad = (DepartamentoFacultad)entidad;
		DepartamentoFacultadDTO departamentoFacultadDTO = new DepartamentoFacultadDTO();
		departamentoFacultadDTO.setIdDepartamentoFacultad(departamentoFacultad.getIdDepartamentoFacultad());
		departamentoFacultadDTO.setNombreDepartamentoFacultad(departamentoFacultad.getNombreDepartamentoFacultad());
		departamentoFacultadDTO.setFacultadDTO(facultadDTO);
		return departamentoFacultadDTO;
	}

	@Override
	public DepartamentoFacultadDTO getDTOPorNombre(String string) {
		for (Iterator iterator = mapaDepartamentoFacultads.values().iterator(); iterator.hasNext();) {
			DepartamentoFacultadDTO dto = (DepartamentoFacultadDTO) iterator.next();
			if(dto.getNombreDepartamentoFacultad().equals(string)){
				return dto;
			}
		} 
		return null;
	}

}
